// 创建一个axios实例
const instance = axios.create({
    baseURL: 'http://43.139.230.42:8001',
    timeout: 300000,
    headers: {
        'Content-Type': 'application/json',
        'X-Token': getLocalToken() // headers塞token
    }
});

// 从localStorage中获取token
function getLocalToken() {
    const token = window.localStorage.getItem('token')
    return token
}

// 给实例添加一个setToken方法，用于登录后将最新token动态添加到header，同时将token保存在localStorage中
instance.setToken = (token) => {
    instance.defaults.headers['X-Token'] = token
    instance.defaults.headers['Authorization'] = `Bearer ${token}`
    window.localStorage.setItem('token', token)
}

function refreshToken() {
    // instance是当前request.js中已创建的axios实例
    return instance.post('/login', {
        "username": window.localStorage.getItem('username'),
        "password": window.localStorage.getItem('password'),
    }).then(res => res.data)
}



// 是否正在刷新的标记
let isRefreshing = false
// 重试队列，每一项将是一个待执行的函数形式
let requests = []




instance.interceptors.response.use(response => {
    const { code } = response.data;
    if (code === 401) {
        const config = response.config
        if (!isRefreshing) {
            isRefreshing = true
            return refreshToken().then(res => {
                const { token } = res.data
                instance.setToken(token)
                setTokenCookie(token) // 将最新的 token 值保存到 cookie 中
                config.headers['X-Token'] = token
                config.headers['Authorization'] = `Bearer ${token}`
                // 已经刷新了token，将所有队列中的请求进行重试
                requests.forEach(cb => cb(token))
                requests = []
                return instance(config)
            }).catch(res => {
                console.error('refreshtoken error =>', res)
                // window.location.href = '/'
            }).finally(() => {
                isRefreshing = false
            })
        } else {
            // 正在刷新token，将返回一个未执行resolve的promise
            return new Promise((resolve) => {
                // 将resolve放进队列，用一个函数形式来保存，等token刷新后直接执行
                requests.push((token) => {
                    config.headers['X-Token'] = token
                    config.headers['Authorization'] = `Bearer ${token}`
                    resolve(instance(config))
                })
            })
        }
    }

    return response
}, error => {
    return Promise.reject(error)
})


// 在用户成功登录后，记录登录时间戳并保存在 cookie 中
function setLoginTimestampCookie(timestamp) {
    const expires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) // 设置过期时间为七天后

    document.cookie = `loginTimestamp=${timestamp}; expires=${expires.toUTCString()}; path=/`
}

// 获取保存在 cookie 中的登录时间戳
function getLoginTimestampFromCookie() {
    const cookies = document.cookie.split(';')
    for (let i = 0; i < cookies.length; i++) {
        const cookie = cookies[i].trim()
        if (cookie.startsWith('loginTimestamp=')) {
            return parseInt(cookie.substring('loginTimestamp='.length, cookie.length))
        }
    }
    return null
}

// 在客户端启动时，读取 cookie 中的登录时间戳，并保存在 localStorage 中
const loginTimestampFromCookie = getLoginTimestampFromCookie()
if (loginTimestampFromCookie) {
    localStorage.setItem('loginTimestamp', loginTimestampFromCookie)
}

// 在用户成功登录后，记录登录时间戳，并保存在 cookie 和 localStorage 中
export function handleSuccessfulLogin() {
    const loginTimestamp = Date.now()
    setLoginTimestampCookie(loginTimestamp)
    localStorage.setItem('loginTimestamp', loginTimestamp)
}



// 在下一次打开页面时，检查登录时间戳是否超过了七天
const loginTimestamp = localStorage.getItem('loginTimestamp')
if (loginTimestamp && (Date.now() - loginTimestamp > 7 * 24 * 60 * 60 * 1000)) {
    // 跳转到登录页重新登录
    window.location.href = 'login.html'
}



export default instance;

